void _spin_lock_recursive(spinlock_t *lock)
{
int cpu = smp_processor_id();
+
+ /* Don't allow overflow of recurse_cpu field. */
+ BUILD_BUG_ON(NR_CPUS > 0xfffu);
+
if ( likely(lock->recurse_cpu != cpu) )
{
spin_lock(lock);
lock->recurse_cpu = cpu;
}
+
+ /* We support only fairly shallow recursion, else the counter overflows. */
+ ASSERT(lock->recurse_cnt < 0xfu);
lock->recurse_cnt++;
}
{
if ( likely(--lock->recurse_cnt == 0) )
{
- lock->recurse_cpu = -1;
+ lock->recurse_cpu = 0xfffu;
spin_unlock(lock);
}
}
typedef struct {
raw_spinlock_t raw;
- s8 recurse_cpu;
- u8 recurse_cnt;
+ u16 recurse_cpu:12;
+ u16 recurse_cnt:4;
} spinlock_t;
-#define SPIN_LOCK_UNLOCKED { _RAW_SPIN_LOCK_UNLOCKED, -1, 0 }
+#define SPIN_LOCK_UNLOCKED { _RAW_SPIN_LOCK_UNLOCKED, 0xfffu, 0 }
#define DEFINE_SPINLOCK(l) spinlock_t l = SPIN_LOCK_UNLOCKED
#define spin_lock_init(l) (*(l) = (spinlock_t)SPIN_LOCK_UNLOCKED)